package cc.co.taciano.agenda2.dao;

import java.util.List;

import cc.co.taciano.agenda2.beans.Usuario;
import cc.co.taciano.agenda2.beans.Perfil;
import cc.co.taciano.agenda2.dao.util.DataAccessLayerException;
import cc.co.taciano.agenda2.dao.util.HibernateFactory;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Restrictions;

/**
 * Classe de persistência do bean Usuario.
 * @author Taciano Morais Silva
 * @version 28/10/2008, 14h32m
 * @since 28/10/2008, 14h32m
 */
public class UsuarioDao extends AbstractDao<Usuario> implements Dao<Usuario> {

    public UsuarioDao() {
        super();
    }

    @Override
    public void create(Usuario usuario) throws DataAccessLayerException {
        super.saveOrUpdate(usuario);
    }

    @Override
    public void remove(Usuario usuario) throws DataAccessLayerException {
        super.delete(usuario);
    }

    @Override
    public void remove(Integer id) throws DataAccessLayerException {
        super.delete(Usuario.class, id);
    }

    @Override
    public Usuario find(Integer id) throws DataAccessLayerException {
        return (Usuario) super.find(Usuario.class, id);
    }

    @Override
    public void update(Usuario usuario) throws DataAccessLayerException {
        super.saveOrUpdate(usuario);
    }

    @Override
    public List<Usuario> findAll() throws DataAccessLayerException {
        return super.findAll(Usuario.class);
    }
    
    @SuppressWarnings("unchecked")
    public List<Usuario> pesquisar(String login, String nome, Perfil perfil) throws DataAccessLayerException {
        List<Usuario> usuarios = null;
        try {
            session = HibernateFactory.openSession();
            tx = session.beginTransaction();
            Criteria criteria = session.createCriteria(Usuario.class);
            if (login != null && !login.equals("")) {
                criteria.add(Restrictions.like("login", login+"%"));
            }
            if (nome != null && !nome.equals("")) {
                criteria.add(Restrictions.like("nome", nome+"%"));
            }
            if (perfil != null && perfil.getId() != 0) {
                criteria.add(Restrictions.eq("perfil", perfil));
            }
            usuarios = (List<Usuario>)criteria.list();
            tx.commit();
        } catch (HibernateException e) {
            HibernateFactory.rollback(tx);
            throw new DataAccessLayerException(e);
        } finally {
            HibernateFactory.close(session);
        }
        return usuarios;
    }
}